package Hot100.Medium.Array;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class LC54_SpiralMatrix {
    public static void main(String[] args) {

    }

    public List<Integer> spiralOrder(int[][] matrix) {
        if(matrix.length == 0) return new ArrayList<>();
        int l = 0; // 左边界（初始第0列）
        int r = matrix[0].length - 1;// 右边界（初始最后一列）
        int t = 0;// 上边界（初始第0行）
        int b = matrix.length - 1;// 下边界（初始最后一行）
        int x = 0;// 结果数组的索引（记录当前填充位置）
        // 结果数组：长度 = 矩阵总元素数（行数×列数）
        Integer[] res = new Integer[(r + 1) * (b + 1)];
        while(true){
            for(int i = l; i <= r; i++) {
                res[x++] = matrix[t][i];
            }
            if(++t > b) break;// 上边界向下收缩（t+1），若收缩后上边界 > 下边界，说明无行可遍历，退出

            for(int i = t; i <= b; i++){
                res[x++] = matrix[i][r];
            }
            if(l > --r) break;// 右边界向左收缩（r-1），若收缩后左边界 > 右边界，退出

            for(int i = r; i >= l; i--){
                res[x++] = matrix[b][i];
            }
            if(--b < t) break;// 下边界向上收缩（b-1），若收缩后上边界 > 下边界，退出

            for(int i = b; i >= t; i--){
                res[x++] = matrix[i][l];
            }
            if(++l > r) break;
        }
        return Arrays.asList(res);
    }
}
